/*
 * Fichier: DivisionParZero.java
 * Crée le: 21 juin 2007.
 * Modifié: 7 juillet 2007.
 * Auteurs: Sébastien ESTIENNE.
 * SiteWeb: http://www.prog-info.org/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package chapitre10.division;



import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;



/**
 * <p>Classe permettant de tester l'exception de division par zéro.</p>
 * @author Sébastien ESTIENNE.
 */
public class DivisionParZero extends JFrame implements ActionListener
{
   /**
    * <p>Serial version UID.</p>
    */
   private static final long serialVersionUID = 1L;

   /** Etiquette pour le numérateur. */
   private JLabel etiquetteNumerateur;

   /** Etiquette pour le dénominateur. */
   private JLabel etiquetteDenominateur;

   /** Etiquette pour le résultat. */
   private JLabel etiquetteResultat;

   /** Champ texte pour le numérateur. */
   private JTextField champNumerateur;

   /** Champ texte pour le dénominateur. */
   private JTextField champDenominateur;

   /** Champ texte pour le résultat. */
   private JTextField champResultat;


   /**
    * <p>Construction de l'application.</p>
    */
   public DivisionParZero()
   {
      // Appel du constructeur de la classe JFrame.
      super("Division par zéro");

      // Obtenir le panneau de contenu et changer son layout en un GridLayout.
      Container conteneur = getContentPane();
      conteneur.setLayout(new GridLayout(3, 2, 5, 5));

      // Initialisation des composants de l'interface graphique.
      this.etiquetteNumerateur = new JLabel("Numérateur :");
      conteneur.add(this.etiquetteNumerateur);
      this.champNumerateur = new JTextField();
      conteneur.add(this.champNumerateur);

      this.etiquetteDenominateur = new JLabel("Dénominateur :");
      conteneur.add(this.etiquetteDenominateur);
      this.champDenominateur = new JTextField();
      conteneur.add(this.champDenominateur);
      this.champDenominateur.addActionListener(this);

      this.etiquetteResultat = new JLabel("Résultat :");
      conteneur.add(this.etiquetteResultat);
      this.champResultat = new JTextField();
      this.champResultat.setEditable(false);
      conteneur.add(this.champResultat);

      // Modifie les propriétés de la fenêtre.
      setSize(260, 110);
      setLocation(100, 100);
      setVisible(true);
   }


   /**
    * <p>Traite une demande de calcul de quotient (résultat).</p>
    * @param actionEvent Un événement sémantique qui indique qu'une action s'est produite dans le
    *        composant concerné.
    */
   public void actionPerformed(ActionEvent actionEvent)
   {
      // Efface le champ résultat.
      this.champResultat.setText("");

      // Format du champ résultat.
      DecimalFormat precision = new DecimalFormat("0.000");

      // Essaie de récupérer les valeurs saisies et de calculer le quotient.
      try
      {
         int numerateur = Integer.parseInt(this.champNumerateur.getText());
         int denominateur = Integer.parseInt(this.champDenominateur.getText());
         double resultat = quotient(numerateur, denominateur);
         this.champResultat.setText(precision.format(resultat));
      }
      // Traite une erreur de format.
      catch(NumberFormatException nfe)
      {
         JOptionPane.showMessageDialog(this,
               "Le numérateur et le dénominateur doivent être des nombres entiers.",
               "Erreur de format", JOptionPane.ERROR_MESSAGE);
      }
      // Traite une erreur de division par zéro.
      catch(DivisionParZeroException dpze)
      {
         JOptionPane.showMessageDialog(this, dpze.getMessage(), "Erreur de division",
               JOptionPane.ERROR_MESSAGE);
      }
   }


   /**
    * <p>Effectue la division.</p>
    * @param pNumerateur Le numérateur.
    * @param pDenominateur Le dénominateur.
    * @return Le résultat de la division.
    * @throws DivisionParZeroException Lance une exception lorsque le dénominateur vaut zéro.
    */
   public double quotient(int pNumerateur, int pDenominateur) throws DivisionParZeroException
   {
      if(pDenominateur == 0)
      {
         throw new DivisionParZeroException();
      }

      return (double) pNumerateur / pDenominateur;
   }


   /**
    * <p>Lance l'application.</p>
    * @param args Les paramètres de la ligne de commande.
    */
   public static void main(String[] args)
   {
      new DivisionParZero();
   }
}
